weltpokalfandomcom_de-20200214-history
Modul:Sports results
Module to build results cross-tables for standings in Sports -- See documentation for details local p = {} -- Main function function p.main(frame) -- Get the args, stripping out blank values local getArgs = require('Modul:Arguments').getArgs local Args = getArgs(frame, {parentFirst = true}) -- Exit early if we are using section transclusion for a different section if (Args'transcludesection' and Args'section') and Args'transcludesection' ~= Args'section' then return '' end -- Declare locals local t = {} local t_footer = {} local t_return = {} local team_list = {} local notes_exist = false local ii, ii_fw, bg_col, team_name, team_code_ii, ii_start, ii_end -- Optional custom team header local team_header = Args'team_header' or 'Home \\ Away' -- Number of legs local legs = tonumber(Args'legs') or 1 -- Edit links if requested local baselink = frame:getParent():getTitle() if mw.title.getCurrentTitle().text baselink then baselink = '' end local template_name = Args'template_name' or (baselink ~= '' and (':' .. baselink)) or '' local edit_links = template_name '' and '' or frame:expandTemplate{ title = 'navbar', args = { mini=1, style='float:right', template_name} } -- Get the custom start point for the table (most will start by default at 1) local top_pos = tonumber(Args'highest_pos') or 1 -- Get the custom end point for the table (unrestricted if bottom_pos is < top_pos) local bottom_pos = tonumber(Args'lowest_pos') or 0 local N_teams = top_pos - 1 -- Default to 0 at start, but higher number needed to skip certain entries -- Load some other modules local p_sub = require('Modul:Sports table/sub') -- Read in number of consecutive teams (ignore entries after skipping a spot) ii_start = N_teams while Args'team'..N_teams+1 ~= nil and (bottom_pos < top_pos or N_teams < bottom_pos) do N_teams = N_teams+1 -- Sneakily add it twice to the team_list parameter, once for the actual -- ranking, the second for position lookup in sub-tables -- This is possible because Lua allows both numbers and strings as indices. team_listN_teams = Args'team'..N_teams -- i^th entry is team X team_list[Args'team'..N_teams] = N_teams -- team X entry is position i end ii_end = N_teams -- Get team to show local ii_show = team_list[Args'showteam'] -- nil if non-existant -- Set the font size local font_size=Args'font_size' or '100%' -- Create header -- Open table table.insert(t,' \n') -- Get info for footer local update = Args'update' or 'unknown' local start_date = Args'start_date' or 'unknown' local source = Args'source' or frame:expandTemplate{ title = 'citation needed', args = { reason='No source parameter defined', date=os.date('%B %Y') } } -- Create footer text -- Date updating if string.lower(update) 'complete' then -- Do nothing elseif update '' then -- Empty parameter table.insert(t_footer,'Updated to match(es) played on unknown. ') elseif string.lower(update) 'future' then -- Future start date table.insert(t_footer,'First match(es) will be played on '..start_date..'. ') else table.insert(t_footer,'Updated to match(es) played on '..update..'. ') end table.insert(t_footer,'Source: '..source) if (Args'matches_style' or ) 'FBR' then table.insert(t_footer, Args'team_header' and ' Colours: Blue = left column team win; Yellow = draw; Red = top row team win.' or ' Colours: Blue = home team win; Yellow = draw; Red = away team win.') elseif (Args'matches_style' or '') 'BSR' then table.insert(t_footer, Args'team_header' and ' Colours: Blue = left column team win; Red = top row team win.' or ' Colours: Blue = home team win; Red = away team win.') end if Args'a_note' then table.insert(t_footer, ' For upcoming matches, an "a" indicates there is an article about the rivalry between the two participants.') end if Args'ot_note' then table.insert(t_footer, ' Matches with background in a lighter colour were decided after overtime.') end -- Add notes (if applicable) if notes_exist then table.insert(t_footer,' Notes:') -- As reflist size text t_footer = ' '..table.concat(t_footer)..' ' t_footer = t_footer..frame:expandTemplate{ title = 'notelist', args = { group='Table_notes'} } else -- As reflist size text t_footer = ' '..table.concat(t_footer)..' ' end -- Add footer to main text table table.insert(t,t_footer) -- Rewrite anchor links for k=1,#t do if tk:match('%[%[#[^%%]*%|') then tk = mw.ustring.gsub(tk, '(%[%[)(#[^%%]*%|)', '%1' .. baselink .. '%2') end end return table.concat(t) end -- Other functions local function get_short_name(s, t, n, ss) -- return short name if defined if s and s ~= '' then return s end -- deflag if necessary if ss and n then if ss 'noflag' then n = mw.ustring.gsub(n, '%[%[FfIiLlEe:[^%%]*%]%]', '') elseif ss 'flag' then n = mw.ustring.gsub(n, '(%s*%[%[FfIiLlEe:[^%%]*link=)%[%]*(%]%]^<>*)%s*%[%[([^%%%|]*)%|[^%%]*%]%]', '%1%3%2') n = mw.ustring.gsub(n, ' ()', '%1') end end -- replace link text in name with team abbr if possible if n and t and n:match('(%[%^%[%*%]%])') then n = mw.ustring.gsub(n, '(%[%%*%|)%]*(%]%])', '%1' .. t .. '%2') n = mw.ustring.gsub(n, '(%[%%*)(%]%])', '%1|' .. t .. '%2') return n end -- nothing worked, so just return the unlinked team abbr return t or '' end local function get_score_background(s, c) local s1, s2 -- Define the colouring local wc, lc, tc if c 'level2' then wc, lc, tc = '#CCF9FF', '#FCC', '#FFC' -- blue2, red2, yellow2 elseif c 'level3' then wc, lc, tc = '#DDFCFF', '#FDD', '#FFD' -- blue3, red3, yellow3 elseif c 'level4' then wc, lc, tc = '#EEFFFF', '#FEE', '#FFE' -- blue4, red4, yellow4 else wc, lc, tc = '#BBF3FF', '#FBB', '#FFB' -- blue1, red1, yellow1 end -- delink if necessary if s:match('^%s*%[%^%[%*%|([^%%]*)%]%]') then s = s:match('^%s*%[%^%[%*%|([^%%]*)%]%]') end if s:match('^%s*%[[^%%%s]*%s([^%%]*)%]') then s = s:match('^%s*%[[^%%%s]*%s([^%%]*)%]') end -- get the scores s1 = tonumber(mw.ustring.gsub( s or '', '^%s*(%d%d*)%s*–%s*(%d%d*).*', '%1' ) or '') or '' s2 = tonumber(mw.ustring.gsub( s or '', '^%s*(%d%d*)%s*–%s*(%d%d*).*', '%2' ) or '') or '' -- return colouring if possible if s1 ~= '' and s2 ~= '' then return (s1 > s2) and wc or ((s2 > s1) and lc or tc) else return 'transparent' end end local function format_score(s) s = mw.ustring.gsub(s or '', '^%s*(%d+)%s*–−—%-%s*(%d+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%d+)%s*&MmNnDdAaSsHh;%s*(%d+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%[%^%[%*%|%d+)%s*%-%s*(%d+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%[[^%%%s]*%s+%d+)%s*%-%s*(%d+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%[%^%[%*%|%d+)%s*&MmNnDdAaSsHh;%s*(%d+)', '%1–%2') s = mw.ustring.gsub(s, '^%s*(%[[^%%%s]*%s+%d+)%s*&MmNnDdAaSsHh;%s*(%d+)', '%1–%2') return s end function p.header(tt,Args,p_sub,N_teams,team_list,legs) local ii, team_code_ii, short_name legs = legs or 1 -- Set match column width local col_width = Args'match_col_width' or '28' -- Get some default values in case it doesn't start at 1 local top_pos = tonumber(Args'highest_pos') or 1 for l=1,legs do for ii=top_pos,N_teams do team_code_ii = team_listii short_name = get_short_name(Args'short_'..team_code_ii, team_code_ii, Args'name_'..team_code_ii, Args'short_style' or '') local bl = legs > 1 and ii top_pos and ' style="border-left:2px solid #aaa;"' or '' tt = p_sub.colhead(tt,col_width .. bl,short_name) end end return tt end function p.row(tt,Args,N_teams,team_list,ii,ii_show,legs) -- Note ii is the row number being shown local jj, fw, bg, result, result_extra, team_code_ii, team_code_jj legs = legs or 1 -- Set score cell style local matches_style = Args'matches_style' or '' team_code_ii = team_listii -- Get some default values in case it doesn't start at 1 local top_pos = tonumber(Args'highest_pos') or 1 for l=1,legs do for jj=top_pos,N_teams do team_code_jj = team_listjj local m = (legs 1) and 'match_' or 'match' .. l .. '_' result = Argsm..team_code_ii..'_'..team_code_jj or '' result_extra = Args'result_'..team_code_ii..'_'..team_code_jj or '' local bl = legs > 1 and jj top_pos and 'border-left:2px solid #aaa;' or '' if ii jj or result 'null' then -- Solid cell fw = 'font-weight:' .. (ii ii_show and 'bold' or 'normal') .. ';' bg = 'background:transparent;' -- Grey background color for solid cell if Args'solid_cell' 'grey' then table.insert(tt,'| style="'..fw..bl..'background:#bbb;" |\n') else table.insert(tt,'| style="'..fw..bl..bg..'" | —\n') end else -- Content cell -- Set bolding and background fw = 'font-weight:' .. ((ii ii_show or jj ii_show) and 'bold' or 'normal') .. ';' bg = 'background:transparent;' -- Reformat dashes if result ~= '' then result = format_score(result) end -- Background coloring if enabled if matches_style 'FBR' and result ~= '' then if result_extra 'OT' then bg = 'background:' .. get_score_background(result,'level2') .. ';' elseif result_extra 'PK' then bg = 'background:' .. get_score_background(result,'level3') .. ';' else bg = 'background:' .. get_score_background(result,) .. ';' end elseif matches_style 'BSR' and result ~= '' then if result_extra 'OT' then bg = 'background:' .. get_score_background(result,'level3') .. ';' else bg = 'background:' .. get_score_background(result,'') .. ';' end end table.insert(tt,'| style="white-space:nowrap;'..fw..bl..bg..'" |'..result..'\n') end end end return tt end return p